#include <vector>
#include <string>
#include <algorithm>
#include <climits>
#include <math.h>
#include <limits.h>
#include <fstream>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

using namespace std;

struct task{
	int duration;  //longitud temporal
	int priority;		//Prioridad, en caso de existir varias a ubicar en una posicion
	vector<int> resources,  //recursos que requiere
			prevTasks;		//Tarea previas
};

struct project{
	vector<int> vTask;		//vector de tareas del proyecto
	int finalDuration;
	bool mode;	//0:backward, 1:forward
};

class RCPSP{
	private:
		vector<project> vProject;
		vector<task> vProjTask;
		vector<bool> res;
		vector<int> fitness;
		vector<int> sortIndx;
		vector<int> vResources;
		int nProj,nTask,tSelec,nComp,maxGenerations,nRes,indMin,desFinalDuration;
		double tCross,tMut,desFitness,minFitness;
		void loadConfig(string file);
		void initRandomPopulation();
		int getFitness();
		void cross();
		void mutation();
		void selectNextPopulation();
		void roulette();
		void window();
		void sortFitness();
		void competency();
		void printProject();
		int find(int p,int x);
		void readData();
		void printBestFitness();
		void createData(int tam);
	public:
		RCPSP();	//constructor por defecto
		void evolution();		//Funcion que integra seleccion, cruza, mutacion y otros...
};
